package pe.com.nextel.http;

import com.nextel.ui.OHandset;
import com.nextel.ui.custom.OProgress;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
//import javax.microedition.lcdui.Gauge;
//import javax.microedition.lcdui.Form;
//import javax.microedition.lcdui.StringItem;

/**
 * Es la form que se muestra mientras se ejecutan los procesos de conexion, envio,
 * recepcion y genera un notifyHttpEnd cuando concluye todo el proceso de conexion
 * para ser capturado en la clase que lanzo a esta form.
 * Ver grafico de proceso de conexion HTTP.
 * @author NEXTEL DEL PERU S.A.
 * @version 1.0
 */
public class FrmStatusHttp  implements HttpListener, XMLListener {
    
    private Http http ;
    private MensajeHttp mensajeHttp;
    private ThreadHttp threadHttp;
    
    private OProgress oProgress;
    private FrmHttpListener frmHttpListener;
    
    public MensajeHttp getHttpMensaje() {
        return this.mensajeHttp;
    }
    
    public FrmStatusHttp() {
        http = new Http();
        http.setHttpListener(this);
        
    }
    
    public void setFrmHttpListener(FrmHttpListener frmHttpListenerp){
        this.frmHttpListener = frmHttpListenerp;
    }
    
    /**
     *
     * @param mensajeHttp objeto que encapsula la URL a la que se va conectar
     * y el mensaje de envio. Cuando termina de ejecutarse el proceso HTTP
     * encapsula el mensaje de retorno.
     */
    public synchronized void setMensajeHttp(MensajeHttp mensajeHttp) {
        
        this.mensajeHttp = mensajeHttp;
        
        try {
            
            
            
            if (threadHttp != null && threadHttp.isAlive()) {
                threadHttp.join();
                threadHttp = null;
            }
            
            
            threadHttp = new ThreadHttp();
            
            if(oProgress == null){
                oProgress = new OProgress( );
            }

            OHandset.getDisplay().setCurrent(oProgress.showScreen("/res/inicio.PNG", "/res/procesando.PNG"));
            
            threadHttp.start();
            
        } catch (Exception e) {
            e.printStackTrace();
            mensajeHttp.setMensaje(("Error hilo : " + e).getBytes());
            frmHttpListener.notifyHttpError(mensajeHttp);
        }
    }

    public void printSuperior(String string) {
    }
    
    
    private class ThreadHttp extends Thread {
        
        public void run() {
            
            try { 
               // System.out.println("inicio de makeConnection");
                http.makeConnection();
               // System.out.println("fin de makeConnection");
                if(oProgress != null)
                    oProgress.destroy( );
                
                System.gc();

            } catch (Exception e) {                
                mensajeHttp.setMensaje(("Error Http : " + e).getBytes());
                frmHttpListener.notifyHttpError(mensajeHttp);
                
            }
        }
    }
    
    public void receiveStatus(Http http, int status) {
        try {
            switch (status) {
                case Http.HTTP_TRYING_CONNECTION_STATUS:
//                    if (!isFinProceso && positionTryingLabel == -1) {
                    oProgress.setEtiquetaSuperior("Connecting");
//                    }
                    break;
                case Http.HTTP_CONNECTED_STATUS:
//                    if (!isFinProceso) {
                    oProgress.setEtiquetaSuperior("Connected");
//                    }
                    break;
                case Http.HTTP_DATA_SENDING_STATUS:
//                    if (!isFinProceso) {
                    oProgress.setEtiquetaSuperior("Sending");
                    //  append(gauge);
//                    }
                    
                    break;
                case Http.HTTP_DATA_RECEIVING_STATUS:
//                    if (!isFinProceso) {
                    oProgress.setEtiquetaSuperior("Receiving...");
//                    }
                    break;
                case Http.HTTP_TERMINATED_OK_STATUS:
//                    if (frmHttpListener != null) {
                    
                    oProgress.setEtiquetaSuperior("Saving...");
                    
                    if (mensajeHttp.isExisteError()) {
//                        System.out.println("existe error");
                        frmHttpListener.notifyHttpError(mensajeHttp);
                        
                    } else {
//                        System.out.println("correcto");
                        frmHttpListener.notifyHttpEnd(mensajeHttp);
                        
                    }
                    
                    break;
                case Http.HTTP_TERMINATED_STATUS:
                    
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
            Alert alert = new Alert("ERROR", "Error, codigo = 100 [" + e + "]", null, AlertType.ERROR);
            alert.setTimeout(Alert.FOREVER);
        }
    }
    
    public void receiveError() {
        frmHttpListener.notifyHttpError(mensajeHttp);
        
    }
    
    
    
    public synchronized void print(String string) {
       // System.out.println("string" + string);
        if(oProgress != null) oProgress.setEtiquetaInferior(string);
        
    }
}
